import { RouteComponent, RouteRecordRaw } from 'vue-router'
import { ICommonObj, IRouteMetaConfig } from '@/types'

/**
 * 路由路径转为名称 /admin/dashboard -> AdminDashboard
 * @param path
 */
export const convertPath2Name = (path: string): string => {
  // 移除路径开头和结尾的斜杠（如果存在）
  const newPath = path.replace(/^\/|\/$/g, '')

  // 将路径按斜杠分割成多个部分
  const parts = newPath.split('/')

  // 处理每个部分：将连字符后的字母大写，并移除连字符；处理动态参数（如 :id）
  return parts.map((part) =>
    part.split('-').map((subPart) => {
      // 处理动态参数（如 :id）
      if (subPart.startsWith(':')) {
        return subPart.slice(1).charAt(0).toUpperCase() + subPart.slice(2)
      }
      // 普通部分
      return subPart.charAt(0).toUpperCase() + subPart.slice(1)
    }).join('')).join('')
}

/**
 * 根据meta的order排序
 * @param routes 路由列表
 */
export const sortRoutesByOrder = (routes: RouteRecordRaw[]): RouteRecordRaw[] => {
  // 排序当前路由的子路由
  routes.forEach((route) => {
    if (route.children && route.children.length > 0) {
      // 如果有子路由，递归排序子路由
      route.children = sortRoutesByOrder(route.children)
    }
  })

  // 对当前路由按 meta.order 排序
  return routes.sort((a, b) => (a.meta?.order as number || 0) - (b.meta?.order as number || 0))
}

/**
 * 获取路由
 * @param modules 通过import.meta.glob导入的模块
 * @param layout 布局组件
 * @param metaConfig 路由meta配置
 */
export const getRoutersByModules = (modules: ICommonObj,
  layout: RouteComponent, metaConfig?: IRouteMetaConfig): RouteRecordRaw[] => {
  // const modules = import.meta.glob('@/views/admin/**/*.vue')
  const routes: RouteRecordRaw[] = []

  Object.keys(modules).forEach((filePath) => {
    // 获取文件的模块路径和文件名
    const parentPath = filePath.substring(0, filePath.lastIndexOf('/')).replace('/src/views', '')
    const path = filePath.replace('.vue', '')
      .replace('/src/views', '')
      .replace(/\[([^\]]+)]/g, '/:$1')

    // 为每个文件生成对应的路由
    const route: RouteRecordRaw = {
      path,
      name: convertPath2Name(path),
      component: modules[filePath]
    }

    // 如果存在meta配置
    if (metaConfig) {
      route.meta = metaConfig[path]

      // 设置重定向属性
      if (route.meta?.redirect) {
        route.redirect = route.meta?.redirect as any
      }
    }

    // 如果该路径已经存在（嵌套路由），则将其作为子路由
    let parentRoute = routes.find((item) => item.path === parentPath)
    if (!parentRoute) {
      parentRoute = {
        path: parentPath,
        name: convertPath2Name(parentPath),
        component: layout,
        children: []
      }

      // 如果存在meta配置
      if (metaConfig) {
        parentRoute.meta = metaConfig[parentPath]

        // 设置重定向属性
        if (parentRoute.meta?.redirect) {
          parentRoute.redirect = parentRoute.meta?.redirect
        }
      }

      routes.push(parentRoute)
    }

    // 如果是子路由，加入到父路由的 `children` 数组
    parentRoute.children?.push(route)
  })

  return routes
}
